import Bus from "./bus.js";

var websocketConnectdCount = 0;

let baseURL =
  process.env.NODE_ENV == "development"
    ? "ws://worker.e-kc.com:2348"
    : "wss://worker.e-kc.vip:2348";

export function newWebsocket() {
  var websocket = null;
  // 判断当前环境是否支持Websocket
  if (window.WebSocket) {
    // 关闭之前打开的 WebSocket 连接
    if (!websocket) {
      websocket = new WebSocket(baseURL);
    } else {
      console.log("not support websocket");
    }

    // 连接成功建立得回调方法
    websocket.onopen = function (e) {
      console.log(e);
      heartCheck.reset().start(); // 成功建立连接后，重置心跳检测
      // websocket.send("socket start"); // 连接成功将消息传给服务端
      console.log("connected successfully");
    };

    // 连接发生错误 会继续尝试发生新得连接 5次
    websocket.onerror = function () {
      console.log("onerror连接发生错误");
      websocketConnectdCount++;
      if (websocketConnectdCount <= 5) {
        newWebsocket();
      }
    };

    // 连接到消息得回调方法
    websocket.onmessage = function (e) {
      const message = e;
      if (message) {
        if (
          JSON.parse(message.data).status === 411 ||
          JSON.parse(message.data).status === 200
        ) {
          Bus.$emit("message", message);
          Bus.$off("message");
          websocket.close();
        }
        Bus.$emit("message", message);
      }
      heartCheck.reset().start(); // 如果获取到消息，说明连接是正常的，重置心跳检测
    };

    // 接受到服务端关闭连接时的回调方法
    websocket.onclose = function (e) {
      console.log("onclose断开连接", e);
    };

    // 监听窗口事件 窗口关闭 主动断开连接
    window.onbeforeunload = function () {
      console.log("关闭");
      websocket.close();
    };

    // 心跳检测, 每隔一段时间检测连接状态，如果处于连接中，
    // 就向server端主动发送消息，来重置server端与客户端的最大连接时间，如果已经断开了，发起重连。
    var heartCheck = {
      timeout: 300000, // 5分钟发一次心跳，比server端设置的连接时间稍微小一点，在接近断开的情况下以通信的方式去重置连接时间。
      timeoutObj: null,
      serverTimeoutObj: null,
      reset: function () {
        clearTimeout(this.timeoutObj);
        clearTimeout(this.serverTimeoutObj);
        return this;
      },
      start: function () {
        this.serverTimeoutObj = setInterval(function () {
          if (websocket.readyState === 1) {
            console.log(websocket.readyState);
            console.log("连接状态，发送消息保持连接");
            heartCheck.reset().start(); // 如果获得消息 说明连接正常 重置心跳检测
          } else {
            console.log("断开连接， 尝试重连");
            newWebsocket();
          }
        }, this.timeout);
      },
    };
  }
}
